Vykonnost Threadu
Otázka od: Karel Pecinka
5. 6. 2004 23:27
Zdravim,
mam aplikaci, ve ktere je zobrazovan cenik. Uzivatel muze filtrovat
zaznamy podle zadaneho filtru nebo zobrazit zbozi z vybrane skupiny.
Zaznamy jsou ulozeny ve Stringlistu protoze jsou nacitany z textoveho
souboru. Z tohoto stringlistu naplnuji po kazde zmene kbMemtable.
Az dosud jsem nepouzival vice vlaken a rychlost vytvoreni takove tabulky
byla uspokojujici (v pripade vsech - asi 4000 zaznamu to trvalo asi 2
sekundy). Nelibilo se mi vsak, ze reakce aplikace napr. pri zmene
skupiny byla pomala - vzdy se cekalo, az se vytvori cely seznam, i kdyz
uzivatel jiz namackal klavesy a nekolikrat zmenil skupinu.
Predelal jsem tedy vytvareni seznamu do druheho vlakna. Aplikaci je nyni
mnohem prijemnejsi ovladat, protoze kdyz uzivatel vybere skupiny a
predchozi seznam neni jeste vytvoren, vlakno se prerusi a vytvori se
nove. Nicmene abych mohl bezpecne naplnit kbMemTable, pouzivam metodu
Synchronize. A prave kvuli ni doslo k vyraznemu zpomaleni pri vytvareni
seznamu - to co trvalo 2 sekundy trva nyni 9 sekund. Kdyz nepouzivam
Synchronize trva to opet 2 sekundy, ale pri velmi rychlem meneni filtru
aplikace vyhazuje chyby. Prioritu vlakna mam nastavenu na
tpTimeCritical.
Je nejaka moznost, jak zajistit uzivatelskou privetivost, tj. zpracovani
seznamu ve druhem vlaknu, a pritom neprijit o vykon jednovlaknoveho
zpracovani?
Diky za rady.
Karel
D5, WinXP
Odpovedá: Petr Vones
6. 6. 2004 11:03
From: "Karel Pecinka" <k.pecinka@seznam.cz>
> Je nejaka moznost, jak zajistit uzivatelskou privetivost, tj. zpracovani
> seznamu ve druhem vlaknu, a pritom neprijit o vykon jednovlaknoveho
> zpracovani?
S tim jak je navrzena VCL vicemene zadna. Vetsina kodu nepocita s tim ze by
byl volan z jineho thredu, proto je nutne pouzivat metodu Synchronize ktera
vykona kod v kontextu hlavniho threadu, tudiz tim mnoho neziskas.
Urcita moznost by mohla byt odpojit TDataSet, v threadu vytvorit novy a ten
pak znovu napojit na ovladaci prvky, pripadne mit dva a ty prehazovat.
Petr Vones